﻿// 202311011933_compiler_linking.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 视频：
// 1. 编译细节
// https://www.bilibili.com/video/BV1TN4y1375q/?spm_id_from=333.788.recommend_more_video.-1&vd_source=8bd7b24b38e3e12c558d839b352b32f4
// 2. 动态库
// https://www.bilibili.com/video/BV1vB4y1V7gR/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=8bd7b24b38e3e12c558d839b352b32f4


#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    // 这里只是一些笔记(Linux中的命令)

    // 1. 编译细节
    // https://www.bilibili.com/video/BV1TN4y1375q/?spm_id_from=333.788.recommend_more_video.-1&vd_source=8bd7b24b38e3e12c558d839b352b32f4
    // 查看文件信息
    // file main
        
    // 查看二进制文件的命令
    // readelf -h main.o
    // readelf -s main.o

    // 观察目标文件中将printf地址置0的程序
    // 注意反汇编部分的call对应的部分。这些0会在链接的过程中被修正。
    // objdump -s -d main.o
    // 在代码块中观察“重定位表”（静态库）
    // objdump -r main.o

    // 2. 动态库
    // https://www.bilibili.com/video/BV1vB4y1V7gR/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=8bd7b24b38e3e12c558d839b352b32f4
    // 查看一个可执行文件依赖的动态链接库
    // readelf -d main | grep NEEDED

    // 基本动态库的创建和使用 02:38
    // 1. 写math.h math.c main.c
    // 2. gcc -shared -fPIC math.c -o libmath.so
    // 3. gcc main.c -lmath -L. -o main
    // 4. 让动态库出现在OS的库搜索路径上
    //     方法一：sudo cp -ar libmath.so /usr/local/lib/
    //     方法二：export LD_LIBRARY_PATH="$(pwd)"
    //     推荐方法二，让Linux获得与Windows相同的寻找动态链接库的行为，即先寻找程序当前所在目录，找不到再寻找系统目录。     
    // 5. ./main

    // 动态链接 vs 静态链接 05:19

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
